
/* eslint-disable no-unreachable */
/* eslint-disable no-undef */
// 权限配置整合：
// 1. appPermissonList: 权限集
// 2. name: 主要用于权限判断方法中传入的参数
// 3. class: 用于ios判断权限时引入对应的java类
// 4. promptTitle: 权限未开启时提示框标题

// 5. promptContent: 权限未开启时提示框内容
const appPermissonList = [
  { name: 'LOCATION', class: 'CLLocationManager', permissionID: 'android.permission.ACCESS_FINE_LOCATION', promptTitle: '位置权限未开启', promptContent: '无法使用位置，请到“设置-埃享”中开启位置权限' }, // 位置权限
  { name: 'CAMERA', class: 'AVCaptureDevice', permissionID: 'android.permission.CAMERA', promptTitle: '相机权限未开启', promptContent: '无法使用相机，请到“设置-埃享”中开启相机权限' }, // 相机权限
  { name: 'GALLERY', class: 'PHPhotoLibrary', permissionID: 'android.permission.READ_EXTERNAL_STORAGE', promptTitle: '外部存储(含相册)读取权限未开启', promptContent: '请到“设置-埃享”中开启外部存储权限' }, // 外部存储(含相册)读取权限
  { name: 'RECORD', class: 'AVAudioSession', permissionID: 'android.permission.RECORD_AUDIO', promptTitle: '麦克风权限未开启', promptContent: '无法使用麦克风，请到“设置-埃享”中开启麦克风权限' }, // 麦克风权限
  { name: 'CONTACTS', class: 'CNContactStore', permissionID: 'android.permission.READ_CONTACTS', promptTitle: '通讯录读取权限未开启', promptContent: '无法读取通讯录，请到“设置-埃享”中开启通讯录读取权限' }, // 通讯录读取权限
  { name: 'CALL', permissionID: 'android.permission.CALL_PHONE', promptTitle: '拨打电话权限未开启', promptContent: '无法拨打电话，请到“设置-埃享”中开启拨打电话权限' }, // 拨打电话权限
  { name: 'PHONE', permissionID: 'android.permission.READ_PHONE_STATE', promptTitle: '访问电话状态权限未开启', promptContent: '无法使用访问电话状态，请到“设置-埃享”中开启访问电话状态权限' }, // 访问电话状态权限
  { name: 'MESSAGE', permissionID: 'android.permission.SEND_SMS', promptTitle: '短信权限未开启', promptContent: '无法发送短信，请到“设置-埃享”中开启短信权限' }
]

/**
 * 获取系统权限
 * @param {Object} permission       权限标识
 *      CAMERA: (String 类型 )访问摄像头权限         用于调用摄像头（plus.camera.* plus.barcode.*）
 *      CONTACTS: (String 类型 )访问系统联系人权限     用于访问（读、写）系统通讯录（plus.gallery.*）
 *      GALLERY: (String 类型 )访问系统相册权限       用于访问（读、写）系统相册（plus.gallery.*）
 *      LOCATION: (String 类型 )定位权限              用于获取当前用户位置信息（plus.geolocation.*）
 *      NOTIFITION: (String 类型 )消息通知权限      用于接收系统消息通知（plus.push.*）
 *      RECORD: (String 类型 )录音权限                用于进行本地录音操作（plus.audio.AudioRecorder）
 *      SHORTCUT: (String 类型 )创建桌面快捷方式权限    用于在系统桌面创建快捷方式图标（plus.navigator.createShortcut）
 *
 * @param {Object} successCallBack  成功回调
 * @param {Object} errorCallBack    失败回调
 */
export default function getPermission(permission: string) {
  // #ifndef APP-PLUS
  return Promise.resolve(true)
  // #endif
  return new Promise((resolve, reject) => {
    // 权限标识转换成大写
    const permissionIdentity = permission.toUpperCase()
    // 获取检测权限的状态
    // eslint-disable-next-line no-undef
    const checkResult = plus.navigator.checkPermission(permissionIdentity as PlusNavigatorPermissionNames)
    // 权限状态是否正常
    let permissionStatusOk = false
    const appPermissonInfo = appPermissonList.find(item => item.name === permissionIdentity)
    // 判断检查权限的结果
    switch (checkResult) {
      case 'authorized':
        // 正常的
        permissionStatusOk = true
        break
      case 'denied':
        // 表示程序已被用户拒绝使用此权限，如果是拒绝的就再次提示用户打开确认提示框
        // 如果有该权限但是没有打开不进行操作还是会去申请或手动打开
        // console.log('已关闭' + permissionName + '权限')
        // errorCallBack('已关闭' + permissionName + '权限');
        // return
        break
      case 'undetermined':
        // 表示程序未确定是否可使用此权限，此时调用对应的API时系统会弹出提示框让用户确认
        // this.requestPermissions(androidPermission, permissionName, successCallBack, errorCallBack)
        // errorCallBack('未确定' + permissionName + '权限');
        // return
        break
      case 'unsupported':
        break
      case 'unknown':
        return reject(new Error(appPermissonInfo?.promptContent))
      default:
        return reject(new Error(appPermissonInfo?.promptContent))
    }
    // 如果权限是正常的执行成功回调
    if (permissionStatusOk) {
      return resolve(true)
    } else {
      // 如果不正常，如果是 andorid 系统，就动态申请权限
      if (plus.os.name === 'Android') {
        // 动态申请权限
        plus.android.requestPermissions([appPermissonInfo?.permissionID as string], function(e) {
          console.log('eeee', e)
          if (e.deniedAlways.length > 0) {
            // 权限被永久拒绝
            // 弹出提示框解释为何需要定位权限，引导用户打开设置页面开启
            showModalFn(appPermissonInfo)
          }
          if (e.deniedPresent.length > 0) {
            // 权限被临时拒绝
            // 弹出提示框解释为何需要定位权限，可再次调用plus.android.requestPermissions申请权限
            return reject(new Error(appPermissonInfo?.promptContent))
          }
          if (e.granted.length > 0) {
            // 权限被允许
            // 调用依赖获取定位权限的代码
            return resolve(true)
          }
        }, function(e) {
          return reject(new Error(appPermissonInfo?.promptContent))
        })
      } else if (plus.os.name === 'iOS') {
        // ios ,第一次使用目的权限时，应用的权限列表里是不存在的，所以先默认执行一下成功回调，打开要使用的操作，比如 plus.camera
        // 这时系统会提示是否打开相应的权限，如果拒绝也没关系，因为应用的权限列表里已经存在该权限了，下次再调用相应权限时，就会
        // 走 else 里的流程，会给用户提示，并且跳转到应该的权限页面，让用户手动打开。
        if (checkResult === 'undetermined') {
          // 调用依赖获取定位权限的代码
          return resolve(true)
        } else {
          // 如果是 ios 系统，ios 没有动态申请操作，所以提示用户去设置页面手动打开
          // // 没有权限弹框提示开启权限方法
          showModalFn(appPermissonInfo)
        }
      }
    }
  })
}
function showModalFn(appPermissonInfo: any) {
  uni.showModal({
    title: appPermissonInfo?.promptTitle,
    content: appPermissonInfo?.promptContent,
    confirmText: '立即开启',
    cancelText: '退出',
    success: function(res) {
      if (res.confirm) {
        // 跳转系统授权管理页
        // ifRequest: 根据业务需求看是否需要跳转，默认跳转
        (uni as any).openAppAuthorizeSetting()
      }
    }
  })
}
